// server.js
require('dotenv').config();
const express = require('express');
const multer = require('multer');
const axios = require('axios');
const cors = require('cors');
const fs = require('fs');
const path = require('path');

const app = express();
const PORT = process.env.PORT || 3000;

// ======================
// 配置 CORS（安全）
// ======================
const allowedOrigins = (process.env.ALLOWED_ORIGINS || '').split(',');
const corsOptions = {
  origin: function (origin, callback) {
    // 允许无 origin（如 App 直连）
    if (!origin) return callback(null, true);
    if (allowedOrigins.includes(origin) || allowedOrigins.includes('*')) {
      callback(null, true);
    } else {
      callback(new Error('Not allowed by CORS'));
    }
  },
  credentials: true,
  optionsSuccessStatus: 200
};
app.use(cors(corsOptions));

// ======================
// 文件上传配置
// ======================
const upload = multer({
  dest: 'uploads/',
  limits: {
    fileSize: 5 * 1024 * 1024 // 限制 5MB
  }
});

// 确保上传目录存在
if (!fs.existsSync('uploads')) {
  fs.mkdirSync('uploads');
}

// ======================
// Qwen-Omni API 调用
// ======================
async function callQwenOmni(base64Image) {
  const API_KEY = process.env.DASHSCOPE_API_KEY;
  if (!API_KEY) {
    throw new Error('DASHSCOPE_API_KEY 未配置');
  }

  const payload = {
    model: "qwen-omni",
    input: {
      messages: [
        {
          role: "user",
          content: [
            {
              image: `image/jpeg;base64,${base64Image}`
            },
            {
              text: "你是一位帮助视障人士的AI助手，请用简洁、温暖的中文描述这张图片的内容。"
            }
          ]
        }
      ]
    },
    parameters: {
      // 注意：截至 2024 年，Qwen-Omni 可能不直接返回 audio_url
      // 因此我们先只请求文本，语音由后端用 TTS 生成（见下方）
      result_format: "text"
    }
  };

  const response = await axios.post(
    'https://dashscope.aliyuncs.com/api/v1/services/qwen-omni/invoke',
    payload,
    {
      headers: {
        'Authorization': `Bearer ${API_KEY}`,
        'Content-Type': 'application/json'
      },
      timeout: 15000
    }
  );

  return response.data;
}

// ======================
// （可选）文本转语音（TTS）
// ======================
// 如果你需要语音，可集成阿里云 TTS 或 Edge TTS
// 此处使用免费的 Edge TTS（无需 Key）
async function textToSpeech(text, outputPath) {
  const { EdgeTTS } = require('edge-tts');
  const tts = new EdgeTTS();
  await tts.setVoice('zh-CN-XiaoxiaoNeural'); // 温暖女声
  await tts.save(outputPath, text);
}

// ======================
// 主 API 路由
// ======================
app.post('/api/qwen-omni', upload.single('image'), async (req, res) => {
  if (!req.file) {
    return res.status(400).json({ success: false, message: '未上传图片' });
  }

  const tempPath = req.file.path;
  let audioPath = '';

  try {
    // 读取图片为 base64
    const imageBuffer = fs.readFileSync(tempPath);
    const base64Image = imageBuffer.toString('base64');

    // 调用 Qwen-Omni
    const qwenResponse = await callQwenOmni(base64Image);
    const text = qwenResponse.output?.text || 'AI 未返回描述';

    // ======================
    // 生成语音（可选）
    // ======================
    // 如果你有 TTS 服务，取消注释以下代码
    /*
    const audioFilename = `audio_${Date.now()}.mp3`;
    audioPath = path.join(__dirname, 'public', 'audio', audioFilename);
    
    // 确保 audio 目录存在
    if (!fs.existsSync(path.dirname(audioPath))) {
      fs.mkdirSync(path.dirname(audioPath), { recursive: true });
    }
    
    await textToSpeech(text, audioPath);
    const audioUrl = `${req.protocol}://${req.get('host')}/audio/${audioFilename}`;
    */

    // 当前只返回文本（语音需额外集成）
    res.json({
      success: true,
      text: text,
      audio_url: null // 暂不支持语音
    });

  } catch (error) {
    console.error('后端错误:', error.message);
    res.status(500).json({
      success: false,
      message: 'AI 服务调用失败'
    });
  } finally {
    // 清理临时文件
    if (fs.existsSync(tempPath)) {
      fs.unlinkSync(tempPath);
    }
    // 如果生成了语音，可设置定时清理（如 1 小时后）
  }
});

// ======================
// 静态文件服务（用于语音文件）
// ======================
// app.use('/audio', express.static(path.join(__dirname, 'public/audio')));

// ======================
// 启动服务器
// ======================
app.listen(PORT, '0.0.0.0', () => {
  console.log(`✅ AI Eyes 后端运行在 http://localhost:${PORT}`);
  console.log(`📌 前端应请求: POST http://your-server.com/api/qwen-omni`);
});